import React from "react";
import formItems from "~/formItems";

import Component from "./component.js";

export default () => {
  return class Entry extends React.Component {
    state = {
      settings: {},
      dataSource: [],
    };

    componentDidMount() {
      window[this.props?.detail?.componentKey || component.name] = {
        // 云组件基本信息
        info: {
          // 云组件唯一标识符
          name: component.name,
          // 云组件构建版本
          version: component.version,
          // 云组件说明
          remark: component.remark,
          // 弃用字段（但需保留）
          terminal: "web",
          // 云组件标题
          decoration: component.description,
          // 云组件分类code
          classifyCode: "ecb248a0da7111edad43956526daf913",
        },
        // 弃用字段
        settings: {},
        // 弃用字段
        extend: {},
        // 工作台样式表单配置项（非工作台组件可忽略！）
        formItems,
        // 工作台“support”配置项（非工作台组件可忽略！）
        support: {
          // 是否在工作台中支持-数据处理（非工作台组件可忽略！）
          data: false,
          // 是否在工作台中支持-样式调整（非工作台组件可忽略！）
          style: false,
          // 是否在工作台中支持-高级操作（非工作台组件可忽略！）
          advance: false,
          // 是否在工作台中支持-联动操作（非工作台组件可忽略！）
          interaction: false,
        },
        /**
         * @description 工作台调用更新组件方法（非工作台组件可忽略！）
         * @param settings 更新的配置
         * @param dataSource 更新的数据
         */
        updateData: this.updateData.bind(this),
      };

      const {
        settings,
        dataSource,
        initialize,

        onMounted,
      } = this.props;

      // IDE组件初始化
      if (initialize) {
        this.updateData(settings, dataSource);
      }

      // IDE需要的配置
      onMounted &&
        onMounted(this.props?.detail?.componentKey, {
          formItems,
          updateData: this.updateData.bind(this),
        });
    }

    updateData(settings = {}, dataSource) {
      this.setState(
        {
          settings,
          dataSource,
        },
        () => {
          this.props.onUpdated &&
            this.props.onUpdated(this.props?.detail?.componentKey, {
              settings,
              dataSource,
            });
        }
      );
    }

    render() {
      const {
        // 工作台输入配置项（非工作台组件可忽略！）
        settings,
        // 工作台输入数据（非工作台组件可忽略！）
        dataSource,
      } = this.state;

      return (
        <Component
          {...this.props}
          settings={settings}
          dataSource={dataSource}
        />
      );
    }
  };
};
